import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import plotly.io as pio
import numpy as np


def excel_to_multi_y_trend_html(input_excel, output_html, x_column, y_columns_dict, title="多Y轴趋势图",
                                date_format="%Y-%m-%d %H:%M:%S"):
    """
    将Excel中的数据绘制成共享X轴但分区域展示不同Y轴的趋势图并保存为HTML

    参数:
        input_excel (str): 输入的Excel文件路径
        output_html (str): 输出的HTML文件路径
        x_column (str): 作为X轴的时间列名
        y_columns_dict (dict): 字典，键为子图标题，值为该子图的Y轴列名列表
        title (str): 图表总标题
        date_format (str): 时间显示格式
    """
    # 读取Excel文件
    try:
        df = pd.read_excel(input_excel).replace([np.nan, pd.NA], None)   # 将缺失值替换为 None（而不是 "--"），这样 Plotly 会自动跳过这些点
    except Exception as e:
        print(f"读取Excel文件失败: {e}")
        return False

    # 确保x_column存在于DataFrame中
    if x_column not in df.columns:
        print(f"错误: 列 '{x_column}' 不存在于Excel文件中")
        return False

    # 检查所有y列是否存在
    all_y_columns = []
    for subplot_title, y_columns in y_columns_dict.items():
        for col in y_columns:
            if col not in df.columns:
                print(f"错误: 列 '{col}' 不存在于Excel文件中")
                return False
            if col == x_column:  # 为了悬浮的时候 去掉时间列 不要重复显示
                print(col)
                continue
            all_y_columns.append(col)

    # 尝试将x列转换为datetime格式
    try:
        df[x_column] = pd.to_datetime(df[x_column])
    except Exception as e:
        print(f"无法将列 '{x_column}' 转换为时间格式: {e}")
        return False

    # 创建子图布局
    fig = make_subplots(
        rows=len(y_columns_dict),
        cols=1,
        shared_xaxes=True,
        subplot_titles=list(y_columns_dict.keys()),
        vertical_spacing=0.05,  # 子图之间的间距
        row_heights=[1] * len(y_columns_dict),  # 等高等宽分布
        specs=[[{"secondary_y": False}]] * len(y_columns_dict)  # 确保所有子图结构一致
    )

    # 为每个子图添加轨迹
    for i, (subplot_title, y_columns) in enumerate(y_columns_dict.items(), start=1):
        for y_col in y_columns:
            fig.add_trace(
                go.Scatter(
                    connectgaps=True,  # 关键设置：断点之间连接
                    x=df[x_column],
                    y=df[y_col],
                    name=y_col,
                    customdata=df[all_y_columns],  # 所有列数据
                    mode='lines+markers',
                    marker=dict(size=6),
                    line=dict(width=2),
                    hovertemplate=f"<b>{y_col}:</b> %{{y:.2f}}<extra></extra>",
                    # hovertemplate=(
                    #         "<br>".join([f"{col}: %{{customdata[{i}]}}"
                    #                      for i, col in enumerate(all_y_columns)]) +
                    #         "<extra></extra>"
                    # ),
                    showlegend=True,
                    hoverinfo='x+y'
                ),
                row=i,
                col=1
            )

    # 更新布局
    fig.update_layout(
        title_text=title,
        height=200 * len(y_columns_dict),
        hovermode="x unified",  # 关键设置：显示同一X位置的所有Y值
    )

    # 设置所有子图的X轴时间格式和悬停格式
    for i in range(1, len(y_columns_dict) + 1):
        fig.update_xaxes(
            tickformat=date_format,
            hoverformat=date_format,
            row=i,
            col=1
        )

    # 保存为HTML文件
    try:
        pio.write_html(fig, file=output_html, auto_open=True)  # 自动打开生成的HTML
        print(f"多Y轴趋势图已成功保存到: {output_html}")
        return True
    except Exception as e:
        print(f"保存HTML文件失败: {e}")
        return False


# 使用示例
if __name__ == "__main__":
    # 示例用法
    #excel_file = "excel/兴华1-50X_油温_回压_日耗电量_电流_均值载荷数据.xlsx"
    #html_file = "兴华1-50X_油温_回压_日耗电量_电流_均值载荷数据.html"
    excel_file = "excel/兴华1-135x_油温_回压_日耗电量_电流_均值载荷数据.xlsx"
    html_file = "兴华1-135x_油温_回压_日耗电量_电流_均值载荷数据.html"
    time_column = "时间"

    # 定义每个子图的Y轴数据
    y_columns_dict = {
        "温度": ["加热杆设定温度", "井口油温"],
        "加热杆日耗电量": ["加热杆日耗电量"],
        "电机日耗电量": ["电机日耗电量"],
        "回压": ["回压"],
    }

    excel_to_multi_y_trend_html(
        input_excel=excel_file,
        output_html=html_file,
        x_column=time_column,
        y_columns_dict=y_columns_dict,
        date_format="%Y-%m-%d %H:%M:%S",
        title="兴华1-135x_数据趋势分析"
        #title="兴华1-50X_数据趋势分析"
    )